package com.reactor.operator;

import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;

import reactor.core.publisher.Flux;

public class CombineLatest {

	public static void main(String[] args) {
		//该操作会将所有流中的最新产生的元素合并成一个新的元素，作为返回结果流中的元素。只要其中任何一个流中产生了新的元素，合并操作就会被执行一次。
		//分析一下第一段输出：
		//第1个Flux用了延时生成，第1个数字0，10秒后才产生，这时第2个Flux中的A,B早就生成完毕，所以此时二个Flux中最新生在的元素，就是[0,B]，类似的，10秒后，第2个数字1依次产生，再执行1次合并，生成[1,B]...
		Flux.combineLatest(
                Arrays::toString,
                Flux.interval(Duration.of(1000, ChronoUnit.MILLIS)).take(3),
                Flux.just("A", "B"))
                .toStream().forEach(System.out::println);

        System.out.println("------------------");

        Flux.combineLatest(
                Arrays::toString,
                Flux.just(0, 1),
                Flux.just("A", "B"))
                .toStream().forEach(System.out::println);

        System.out.println("------------------");

        Flux.combineLatest(
                Arrays::toString,
                Flux.interval(Duration.of(1000, ChronoUnit.MILLIS)).take(2),
                Flux.interval(Duration.of(10000, ChronoUnit.MILLIS)).take(2))
                .toStream().forEach(System.out::println);
	}

}
